package manejoDB;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/**
 * @author Veko
 */
public class AdministradorDBCliente {

    private ConexionDB abm_consulta;

    /**
     * Constructor
     */
    public AdministradorDBCliente() {
        this.abm_consulta = new ConexionDB();
    }

    /**
     * Conexion (Funciona)
     *
     * @return
     * @throws SQLException
     */
    public Boolean Conectar() throws SQLException {
        return this.abm_consulta.conectar();
    }

    public void desconectar() throws SQLException {
        this.abm_consulta.cierraConexion();
    }

    /**
     * AltaCliente:
     * Permite elementos null, el código de cliente es Serial no se especifica
     * @param nombre apellido calle nrocalle localidad pisoNro
     * @param codigoPostal tel cel (Probado) 
     * @throws SQLException
     */
    public void setNuevoCliente(String nombre, String apellido, String calle, 
            String nrocalle, String localidad, String pisoNro, String codigoPostal, 
            String tel, String cel) throws SQLException {
        Boolean eliminado = false;
        this.abm_consulta.insertar("insert into cliente (nombre,apellido,calle,"
                + "nrocalle,localidad,pisonro,codigopostal,telefono,celular) "
                + "values ('" + nombre + "','" + apellido + "','" + calle + "','" 
                + nrocalle + "','" + localidad + "','" + pisoNro + "','" + 
                codigoPostal + "','" + tel + "','" + cel + "');");

    }
    
    /**
     * BajaCliente
     * @param codigoCliente
     * @throws SQLException 
     */

    public void eliminarCliente(Integer codigoCliente) throws SQLException {
        this.abm_consulta.actualizar("update cliente set eliminado = 'true' where idcliente = " + codigoCliente + ";");
    }
    
    
    /**
     * Modificación
     * Agregan datos faltantes o modifican datos preexistentes
     * Verificar el ingreso de los datos, para evitar espacios en blancos
     * updateNombre
     * @param nombre codigo (Probado)
     * updateApellido
     * @param apellido codigo (Probado)
     * updateCP
     * @param codigoPostal codigo (Probado)
     * updateLocalidad
     * @param localidad codigo (Probado)
     * updateCalle
     * @param calle codigo (Probado)
     * updateNroCalle
     * @param nrocalle codigo (Probado)
     * updatePiso
     * @param pisodpto codigo (Probado)
     * updateTel
     * @param telefono codigo (Probado)
     * updateCel
     * @param celular codigo (Probado)
     */
    public void updateNombreCliente(String nombre, Integer codigo) throws SQLException {
        this.abm_consulta.actualizar("update cliente set nombre = '" + nombre + "'  where idcliente = " + codigo + " ; ");
    }

    public void updateApellidoCliente(String apellido, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set apellido = '" + apellido + "'  where idcliente = " + codigo + " ; ");
    }

    public void updateCPCliente(String cp, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set codigopostal= '" + cp + "'  where idcliente = " + codigo + " ; ");
    }

    public void updateLocalidadCliente(String localidad, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set localidad= '" + localidad + "'  where idcliente = " + codigo + " ; ");
    }

    public void updateCalleCliente(String calle, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set calle = '" + calle + "'  where idcliente = " + codigo + " ; ");
    }

    public void updateNroCalleCliente(String nroCalle, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set nrocalle = '" + nroCalle + "'  where idcliente = " + codigo + " ; ");
    }

    public void updatePisoCliente(String piso, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set pisonro = '" + piso + "'  where idcliente = " + codigo + " ; ");
    }

    public void updateTelCliente(String tel, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set telefono = '" + tel + "'  where idcliente = " + codigo + " ; ");
    }

    public void updateCelCliente(String cel, Integer codigo) throws SQLException {
        //throw new UnsupportedOperationException("Not supported yet."); 
        this.abm_consulta.actualizar("update cliente set celular = '" + cel + "'  where idcliente = " + codigo + " ; ");
    }

    /**
     * Getter: (Probado) Para Todos los códigos de clientes
     *
     * @return
     * @throws SQLException
     */
    public List<Integer> getAllCodClientes() throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT idCliente,eliminado FROM cliente ;");
        Integer mostrar = null;
        ArrayList<Integer> clientes = new ArrayList<Integer>();
        while (consulta.next()) {
            mostrar = consulta.getInt("idCliente");

            if (!consulta.getBoolean("eliminado")) {
                clientes.add(mostrar);
            }
        }
        return clientes;
    }

    /**
     * Getters:
     * @param : idCliente 
     * Por códigoCliente retornan un valor único 
     ****Nombre (Probado) ****
     ****Apellido (Probado) ****
     ****Calle (Probado) ****
     ****CalleNro (Probado) ****
     ****Localidad (Probado) ****
     ****CP (Probado) ****
     ****Piso (Probado) ****
     ****Tel (Probado) ****
     ****Cel (Probado) ****
     ****Esta Eliminado (Probado) ****
     * Devuelven null si el cliente no existe.
     * No devuelven nada si el valor no esta cargado. (Guardo Strings vacíos?)
     * @throws SQLException
     */
    public String getNombreClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT nombre FROM cliente  where idcliente = " + cod + ";");

        String mostrar = new String();
        while (consulta.next()) {
            mostrar = consulta.getString("nombre");
        }
        return mostrar;
    }

    public String getApellidoClienteXCod(Integer cod) throws Exception {
        ResultSet apellido = this.abm_consulta.consulta
                ("SELECT apellido FROM cliente  where idcliente = " + cod + ";");

        String mostrar = new String();
        while (apellido.next()) {
            mostrar = apellido.getString("apellido");
        }
        return mostrar;
    }

    public String getCalleClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT calle FROM cliente  where idcliente = " + cod + ";");

        String mostrar = new String();
        while (consulta.next()) {
            mostrar = consulta.getString("calle");
        }
        return mostrar;
    }

    public String getNroCalleClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT nrocalle FROM cliente  where idcliente = " + cod + ";");

        String mostrar = new String();
        while (consulta.next()) {
            mostrar = consulta.getString("nrocalle");
        }
        return mostrar;
    }

    public String getLocalidadClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT localidad FROM cliente  where idcliente = " + cod + ";");

        String mostrar = new String();
        while (consulta.next()) {
            mostrar = consulta.getString("localidad");
        }
        return mostrar;
    }

    public String getCPClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT codigopostal FROM cliente  where idcliente = " + cod + ";");

        String mostrar = new String();
        while (consulta.next()) {
            mostrar = consulta.getString("codigopostal");
        }
        return mostrar;
    }

    public String getPisoNroClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT pisonro FROM cliente  where idcliente = " + cod + ";");

        String mostrar = new String();
        while (consulta.next()) {
            mostrar = consulta.getString("pisonro");
        }
        return mostrar;
    }

    public String getTelClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT telefono FROM cliente  where idcliente = " + cod + ";");

        String mostrar = null; 
        while (consulta.next()) {
            mostrar = consulta.getString("telefono");
        }
        return mostrar;

    }

    public String getCelClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT celular FROM cliente  where idcliente = " + cod + ";");

        String mostrar = null; 
        while (consulta.next()) {
            mostrar = consulta.getString("celular");
        }
        return mostrar;
    }

    public Boolean getEliminadoClienteXCod(Integer cod) throws Exception {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT eliminado FROM cliente  where idcliente = " + cod + ";");

        Boolean mostrar = null;
        while (consulta.next()) {
            mostrar = consulta.getBoolean("eliminado");
        }
        return mostrar;
    }

    /**
     * Getters:
     * Por datos, retornan una lista de códigos de clientes 
     * Postgresql es case sensitive, es necesario usar LOWER o UPPER
     * Falta una validación para los espacios en blanco (desde la lógica)
     ****@param Nombre (Probado) ****
     ****@param Apellido (Probado) ****
     ****@param Docimilio: Localidad Calle NroCalle (Probado) ****
     ****@param Tel (Probado) ****
     ****@param Cel (Probado) ****
     * Devuelven null si el cliente no existe.
     * No devuelven nada si el valor no esta cargado. 
     * @throws SQLException
     */
    
    public List<Integer> getClienteXNombre(String nombre) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta ("SELECT idcliente,"
                + "eliminado FROM cliente  where lower(nombre) like lower('%" + nombre + "%')");
        List<Integer> mostrar = new ArrayList<Integer>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idcliente");
            boolean eliminado = consulta.getBoolean("eliminado");
            if (!eliminado) {
                mostrar.add(id);
            }
        }
        return mostrar;

    }

    public List<Integer> getClienteXApellido(String apellido) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta ("SELECT idcliente,"
                + "eliminado  FROM cliente  where lower(apellido) like lower('%" + apellido + "%')");

        List<Integer> mostrar = new ArrayList<Integer>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idcliente");
            boolean eliminado = consulta.getBoolean("eliminado");
            if (!eliminado) {
                mostrar.add(id);
            }
        }
        return mostrar;
    }

    public List<Integer> getClienteXDomicilio(String localidad,String calle, 
            Integer nro) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT idCliente,eliminado FROM cliente  where lower(localidad)"
                + "= lower('"+localidad+"') and lower(calle) = "
                + "lower('" + calle + "') and nrocalle = '" + nro + "'");

        List<Integer> mostrar = new ArrayList<Integer>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idcliente");
            boolean eliminado = consulta.getBoolean("eliminado");
            if (!eliminado) {
                mostrar.add(id);
            }
        }
        return mostrar;
    }

    public List<Integer> getClienteXTel(String tel) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("SELECT idcliente,eliminado FROM cliente  where telefono = '" + tel + "';");

        List<Integer> mostrar = new ArrayList<>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idcliente");
            boolean eliminado = consulta.getBoolean("eliminado");
            if (!eliminado) {
                mostrar.add(id);
            }
        }
        return mostrar;
    }

    public List<Integer> getClienteXCel(String cel) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("SELECT idcliente,eliminado FROM cliente  where celular = '" + cel + "';");

        List<Integer> mostrar = new ArrayList<>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idcliente");
            boolean eliminado = consulta.getBoolean("eliminado");
            if (!eliminado) {
                mostrar.add(id);
            }
        }
        return mostrar;
    }


    /**
     *
     * @return El valor del código del cliente que se va a ingresar
     * @throws SQLException
     */
    public Integer getNuevoCodigoCliente() throws SQLException {
        Integer retorno = null;
        ResultSet consulta = this.abm_consulta.consulta(" SELECT idcliente FROM cliente");
        int i=0;
        while(consulta.next()){
            i++;/*
            retorno=consulta.getInt("idcliente");
            if (retorno != null) {
                retorno = retorno + 1; //el código de la orden no va a ser el último ingresado sino el siguiente
            } else {
                retorno = 1;
            }*/
        }
        //return retorno;
       return i+1;
    }

    static public void main(String[] args) throws SQLException, Exception {
        AdministradorDBCliente adbc = new AdministradorDBCliente();
        adbc.abm_consulta.conectar();
        System.out.println(adbc.getNuevoCodigoCliente());
        //System.out.println("el numero de telefono es "+adbc.getEliminadoClienteXCod(20));
        try{
         System.out.print("entro");   
         List <Integer> lista=new ArrayList<Integer>();
         adbc.getNuevoCodigoCliente();
         System.out.print("ejecuto");   
         ListIterator it=lista.listIterator();
         while(it.hasNext()){
         Integer i=(Integer)it.next();
         System.out.print("salio"+i);
         }
         } catch (Exception e){
         System.out.print("hubo una  excepción");
         }

    }

    public boolean codigoExistente(Integer valorBusqueda) throws SQLException {
        Integer ret = null;
        boolean retorno=false;
        boolean eliminado=false;
        ResultSet consulta = this.abm_consulta.consulta(" SELECT idcliente,eliminado FROM cliente where idcliente="+valorBusqueda
                + ";");
        int i=0;
        while(consulta.next()){
            eliminado=consulta.getBoolean("eliminado");
            if(!eliminado){
                ret=consulta.getInt("idcliente");
                retorno=true;
            }
        }
        //return retorno;
       return retorno;
    }
}
